/************** 注意：此文件中的代码，不要做任何修改 ****************/
const config = require("./config")
const axios = require('axios');

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

const axiosPost = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params)
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
};
const axiosGet = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params,
      })
      .then(res => {
        resolve(res);
      })
      .catch(err => {
        reject(err);
      });
  });
};

// 获取token
async function getToken() {
  const params = {
    grant_type: 'client_credential',
    appid: config.app_id,
    secret: config.app_secret,
  };
  let res = await axiosGet('https://api.weixin.qq.com/cgi-bin/token', params);
  return res.data.access_token;
}
// 获取天气情况
async function get_weather() {
  const params = {
    openId: "aiuicus",
    clientType: "h5",
    sign: "h5",
    city: config.city
  }
  let res = await axiosGet(`http://autodev.openspeech.cn/csp/api/v2.1/weather`, params)
  // console.log(res.data.data.list[0]);
  return res.data.data.list[0]
}
get_weather()

// 获取当前时间：格式 2022年8月25日 星期五
function getCurrentDate() {
  var myDate = new Date();
  var year = myDate.getFullYear(); //年
  var month = myDate.getMonth() + 1; //月
  var day = myDate.getDate(); //日
  var days = myDate.getDay();
  switch (days) {
    case 1:
      days = '星期一';
      break;
    case 2:
      days = '星期二';
      break;
    case 3:
      days = '星期三';
      break;
    case 4:
      days = '星期四';
      break;
    case 5:
      days = '星期五';
      break;
    case 6:
      days = '星期六';
      break;
    case 0:
      days = '星期日';
      break;
  }
  var str = year + "年" + month + "月" + day + "日  " + days;
  return str;
}

// 计算生日还有多少天
function brthDate(brth) {
  let m = parseInt(brth.split("/")[0])
  let d = parseInt(brth.split("/")[1])
  let today = new Date();
  let year = today.getFullYear();
  let month = today.getMonth();
  let date = today.getDate();
  let byear = year;
  //计算今年生日是否过完，过完就算明年生日了
  if (m < month) {
    byear++;
  } else if (m == month || d <= date) {
    byear++;
  }
  let brthday = new Date(byear + "-" + m + "-" + d);
  //核心，两个日期相减，得到一个整数，是两个日期之间相差的毫秒数
  let dms = brthday - today;
  //毫秒除以1000得到秒，除以3600得到小时，除以24得到日
  let dday = Math.round(dms / (1000 * 3600 * 24));
  return dday;
}

// 土味情话
async function sweetNothings() {
  let res = await axiosGet("https://api.1314.cool/words/api.php?return=json")
  let str = ""
  config.loveStr ? str = config.loveStr : str = res.data.word
  return str.replace(/<br>/g, "\n")
}
sweetNothings()

// 随机颜色
function randomColor() {
  let randomColor = "#" + parseInt(Math.random() * 0x1000000).toString(16).padStart(6, "0")
  // console.log(randomColor);
  return randomColor
}

async function templateMessageSend() {
  const token = await getToken();
  const url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' + token;
  // 天气信息
  let weatherInfo = await get_weather()
  // 计算在一起的天数
  let n1 = new Date(config.love_date);
  let n2 = new Date()
  let n = n2.getTime() - n1.getTime()
  let together_day = parseInt(n / 1000 / 60 / 60 / 24)
  // 每日情话
  let loveStr = await sweetNothings()
  // 模板id 配置项
  const params = {
    touser: config.user,
    template_id: config.template_id,
    url: 'http://weixin.qq.com/download',
    topcolor: '#FF0000',
    data: {
      // 当前日期
      nowDate: {
        value: getCurrentDate(),
        color: randomColor(),
      },
      // 省份
      province: {
        value: weatherInfo.province,
        color: randomColor(),
      },
      // 城市
      city: {
        value: weatherInfo.city,
        color: randomColor(),
      },
      // 天气
      weather: {
        value: weatherInfo.weather,
        color: randomColor(),
      },
      // 当前气温
      temp: {
        value: weatherInfo.temp + "°C",
        color: randomColor(),
      },
      // 最低气温
      low: {
        value: weatherInfo.low + "°C",
        color: randomColor(),
      },
      // 最高气温
      high: {
        value: weatherInfo.high + "°C",
        color: randomColor(),
      },
      // 风向
      wind: {
        value: weatherInfo.wind,
        color: randomColor(),
      },
      // 空气质量
      airQuality: {
        value: weatherInfo.airQuality,
        color: randomColor(),
      },
      // 湿度
      humidity: {
        value: weatherInfo.humidity,
        color: randomColor(),
      },
      // 宝贝的名字
      dearName: {
        value: config.birthday1.name,
        color: randomColor(),
      },
      // 我的名字
      myName: {
        value: config.birthday2.name,
        color: randomColor(),
      },
      // 距离宝贝生日
      dearBrthDays: {
        value: brthDate(config.birthday1.birthday),
        color: randomColor(),
      },
      // 距离我的生日
      myBrthDays: {
        value: brthDate(config.birthday2.birthday),
        color: randomColor(),
      },
      // 在一起的天数
      loveDays: {
        value: together_day,
        color: randomColor(),
      },
      // 每日情话
      loveWords: {
        value: loveStr,
        color: randomColor(),
      }
    },
  };
  let res = await axiosPost(url, params);
  switch (res.data.errcode) {
    case 40001:
      console.log("推送消息失败,请检查 appId/appSecret 是否正确");
      break
    case 40003:
      console.log("推送消息失败,请检查微信号是否正确");
      break
    case 40037:
      console.log("推送消息失败,请检查模板id是否正确");
      break
    case 0:
      console.log("推送消息成功");
      break
  }
}
// 调用函数，推送模板消息
templateMessageSend(); // 第一次执行程序时会推送一次消息，如使用定时器

// 定时器（Cron）：定时推送消息
const schedule = require('node-schedule');
const scheduleCronstyle = () => {
  // 每天的早8点触发（定时器规则：秒/分/时/日/月/年，*号可理解为"每"的意思，如 0 0 8 * 这个*表示每日）
  schedule.scheduleJob('0 0 8 * * *', () => {
    templateMessageSend();
  });
}
scheduleCronstyle();